package com.bob.like.mq.consumer;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.bob.like.mapper.BlogMapper;
import com.bob.like.mapper.ThumbMapper;
import com.bob.like.model.entity.Blog;
import com.bob.like.mq.event.LikeMessage;
import com.bob.like.service.ThumbService;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;

@Service
@RocketMQMessageListener(
    topic = "Blog_Like_Topic",
    consumerGroup = "blog_like_consumer_group"
)
public class BlogLikeConsumer implements RocketMQListener<LikeMessage> {
    
    @Autowired
    private ThumbService thumbService; // 或直接注入DAO/Repository

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Autowired
    private BlogMapper blogMapper;

    @Override
    public void onMessage(LikeMessage message) {
        // 在此处理收到的点赞消息
        Long userId = message.getUserId();
        Long blogId = message.getBlogId();
        String eventId = message.getEventId();

        // 1. 幂等性校验：检查消息是否已处理过
        String dedupKey = "like:event:" + eventId;
        // 将eventId作为Key存入Redis，用于判重（也可用 userId_blogId 结合timestamp，但eventId更直接唯一）
        Boolean firstProcess = redisTemplate.opsForValue().setIfAbsent(dedupKey, "1", 1, TimeUnit.MINUTES);
        if (firstProcess == null || !firstProcess) {
            // 若返回false表示Key已存在，说明该消息已处理过，直接忽略以保证幂等
            return;
        }

        try {
            // 2. 数据库更新：增量更新点赞记录
            // 尝试更新现有记录的点赞次数
            LambdaUpdateWrapper<Blog> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
            lambdaUpdateWrapper.eq(Blog::getId, blogId);
            lambdaUpdateWrapper.setIncrBy(Blog::getThumbCount, 1);
            blogMapper.update(null, lambdaUpdateWrapper);
            // 数据库操作示例：
            // SQL: UPDATE user_blog_like SET like_count = like_count + 1
            //      WHERE user_id = ? AND blog_id = ?;
            // 如果 updatedRows 为0，则：
            // SQL: INSERT INTO user_blog_like(user_id, blog_id, like_count) VALUES(?, ?, 1);
        } catch (Exception e) {
            // 3. 错误处理：如数据库操作失败，撤销幂等标记以允许重试
            redisTemplate.delete(dedupKey);
            // 将异常抛出以让RocketMQ框架意识到消费失败
            throw e;
        }
        // （可选）4. 更新Redis缓存或其他操作：
        // 由于生产者在用户点赞时已更新Redis，此处通常无需再更新缓存。
        // 若有额外缓存（如博客总点赞数缓存）需要同步，可在这里处理。
    }
}
